using System;
using System.Windows.Forms;
using System.Collections;

using TFlex;
using TFlex.Model;
using TFlex.Model.Model2D;
using TFlex.Model.Model3D;

using TFlex.DOCs.Model;
using TFlex.DOCs.Model.References;
using TFlex.DOCs.Model.Plugins;
using TFlex.DOCs.UI.Common.References;
using TFlex.DOCs.Model.References.Files;


namespace TFlexControlSample
{
	public partial class Form1 : Form
	{
		/// <summary>
		/// Текущий открытый документ
		/// </summary>
		private TFlex.Model.Document doc;
				
		/// <summary>
		/// Конструктор. Инициализирует все компоненты, 
		/// затем подменяет прокси-компонент panel1 на экземпляр объекта класса TFlex.Control
		/// </summary>
		public Form1()
		{
			InitializeComponent();

			//Подменяем System.Windows.Forms.Panel panel1 на TFlex.Control tfcontrol,
			//сохраняя точку привязки и размер
			System.Drawing.Point tflexControlLocation = this.panel1.Location;
			System.Drawing.Size tflexControlSize = this.panel1.Size;
			tfcontrol = new TFlex.Control();
			tfcontrol.ViewType = false;
			tfcontrol.Location = tflexControlLocation;
			tfcontrol.Size = tflexControlSize;
			tfcontrol.BackColor = System.Drawing.Color.White;
			tfcontrol.ShowPageTabs = true;
			tfcontrol.Anchor = this.panel1.Anchor;

			this.panel1.Dispose();
			this.Controls.Add(tfcontrol);
		}

		/// <summary>
		/// Функция установки текущего документа
		/// </summary>
		/// <param name="d"></param>
		/// <returns></returns>
		private bool SetDocument(Document d)
		{
			if (d == doc)
				return true;

			if (doc != null)
			{
                if (!doc.IsDisposed)
                {
                    //Если документ был изменён, то предлагаем его сохранить
                    if (doc.Changed)
                    {
                        if (System.Windows.Forms.MessageBox.Show("Документ изменён. Сохранить?", "T-FLEX Control Test", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                        {
                            if (!doc.Save())
                            {
                                if (System.Windows.Forms.MessageBox.Show("Ошибка сохранения. Продолжить?", "T-FLEX Control Test", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) != DialogResult.OK)
                                {
                                    return false;
                                }
                            }
                        }
                    }
                    doc.Close();
                }
			}
			doc = d;
			tfcontrol.Document = d;			
			
			docname.Text = d == null ? "" : d.Title;

			if (doc == null)
			{
				this.tfcontrol.Invalidate(true);
				tfcontrol.ShowControlButtons = false;
			}
			else
				tfcontrol.ShowControlButtons = true;

			return true;
		}		

		private void newButton_Click(object sender, System.EventArgs e)
		{
			Document d = TFlex.Application.NewDocument();
			if (d == null)
				System.Windows.Forms.MessageBox.Show("Ошибка", "T-FLEX ControlText", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
			else
				if (!SetDocument(d))
					d.Close();
		}

		private void ButtonOpenFromDocs_Click(object sender, System.EventArgs e)
		{
			//Справочник "Номенклатура и изделия"
			const string filesGuid = "a0fcd27d-e0f2-4c5a-bba3-8a452508e6b3";

			ReferenceInfo refInfo = ReferenceCatalog.FindReference(new Guid(filesGuid));

            using (ISelectReferenceObjectDialog myDialog = ObjectCreator.CreateObject<ISelectReferenceObjectDialog>())
            {
                FileReference reference = new FileReference();

                myDialog.Initialize(refInfo);

                if (myDialog.ShowDialog(this) != TFlex.DOCs.UI.Common.DialogOpenResult.Ok)
                    return;

                ReferenceObject[] objects = myDialog.GetSelectedObjects();

                //проходим по выбранным в диалоге объектам, все кот. являются файлами - открываем
                foreach (FileReferenceObject fileObject in objects)
                {
                    //получить последнюю версию файла
                    fileObject.GetHeadRevision();

                    //проверить что текущий FileReferenceObject - файл, если так - открыть
                    if (fileObject.IsFile)
                    {
                        //делать что-то с файлами, основываясь на этих методах:				
                        Document d = TFlex.Application.OpenDocument(fileObject.LocalPath);
                        if (d == null)
                            System.Windows.Forms.MessageBox.Show("Ошибка", "T-FLEX ControlText", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                        else
                            if (!SetDocument(d))
                                d.Close();
                    }
                }
            }
        }

		//открыть документ
		private void openButton_Click(object sender, EventArgs e)
		{
			OpenFileDialog dialog = new OpenFileDialog();
			dialog.Filter = "GRB Files (*.grb)|*.grb";
			if (dialog.ShowDialog() == DialogResult.OK)
			{
				Document d = TFlex.Application.OpenDocument(dialog.FileName);
				if (d == null)
					System.Windows.Forms.MessageBox.Show("Ошибка", "T-FLEX ControlText", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
				else
					if (!SetDocument(d))
						d.Close();
			}
		}

		//выйти из приложения
		private void exitButton_Click(object sender, EventArgs e)
		{
			this.Close();
		}

		//закрыть текущий документ
		private void closeButton_Click(object sender, EventArgs e)
		{
			SetDocument(null);
		}

		//Обработка кнопки "Сохранить как..."
		private void saveAsButton_Click(object sender, System.EventArgs e)
		{
			if (doc != null)
			{
				SaveFileDialog dialog = new SaveFileDialog();
				dialog.Filter = "GRB Files (*.grb)|*.grb";
				if (dialog.ShowDialog() == DialogResult.OK)
				{
					doc.SaveAs(dialog.FileName);
					docname.Text = doc.Title;
				}
			}
		}

		//Пример создания текстов на текущей странице
		private void test1Button_Click(object sender, System.EventArgs e)
		{
			if (doc == null)
				return;
			Document document = doc;

			document.BeginChanges("Создание текста");
			LineText text = new LineText(document);
			text.X = 100;
			text.Y = 100;
			text.TextValue = "Это пример текста\\nв две строки";
			TFlex.Model.Model2D.FontStyle style = text.FontStyle;
			style.FontName = "Arial";
			style.Bold = true;
			style.Italic = true;
			text.Color = 12;

			text = new LineText(document);
			text.X = 30;
			text.Y = 10;
			text.Angle = 90;
			text.TextValue = "Текст шрифтом T-FLEX Type A";
			style = text.FontStyle;
			style.FontName = "T-FLEX Type A";
			style.Size = 15;

			FreeNode node1 = new FreeNode(document, 150, 10);
			FreeNode node2 = new FreeNode(document, 150, 70);
			CircleConstruction circle = new CircleConstruction(document);
			circle.SetCenterAndNode(node1, node2);
			text = new LineText(document);
			text.Node = node2;
			text.Circle = circle;
			text.TextValue = "Текст по окружности";
			text.HorizontalAlignment = TextHorizontalAlignment.Center;

			text = new LineText(document);
			text.X = 400;
			text.Y = 200;
			text.TextValue = "Симметричный наклонный текст";
			text.Symmetric = true;
			style = text.FontStyle;
			style.FontName = "tflex_a.shx";
			style.Tilt = 75;

			text = new LineText(document);
			text.X = 120;
			text.Y = 150;
			text.TextValue = "Дроби и индексы 12345[[67~89]]  ABCD<<+0.123^-0.456>>";
			style = text.FontStyle;
			style.FontName = "Arial";
			document.EndChanges();

			tfcontrol.RefreshTabs();
			tfcontrol.Invalidate(true);
		}

		//Пример создания линий изображения на текущей странице
		private void test2Button_Click(object sender, System.EventArgs e)
		{
			if (doc == null)
				return;
			Document document = doc;
			document.BeginChanges("Создание линий изображения");
			ConstructionOutline line = new ConstructionOutline(document, new FreeNode(document, 10, 10), new FreeNode(document, 200, 10));

			line = new ConstructionOutline(document, new FreeNode(document, 10, 20), new FreeNode(document, 200, 20));
			line.Color = 12;

			line = new ConstructionOutline(document, new FreeNode(document, 10, 30), new FreeNode(document, 200, 30));
			line.LineWidth = 4;

			line = new ConstructionOutline(document, new FreeNode(document, 10, 40), new FreeNode(document, 200, 40));
			line.PatternName = "CENTER";

			line = new ConstructionOutline(document, new FreeNode(document, 10, 50), new FreeNode(document, 200, 50));
			line.StartArrowType = 2;
			line.EndArrowType = 2;

			line = new ConstructionOutline(document, new FreeNode(document, 10, 60), new FreeNode(document, 200, 60));
			line.Style = OutlineStyle.Wave;
			line.WaveNumber = 10;

			line = new ConstructionOutline(document, new FreeNode(document, 10, 70), new FreeNode(document, 200, 70));
			line.PatternName = "Зигзаг";
			line.PatternScale = 0.5;

			document.EndChanges();

			tfcontrol.RefreshTabs();
			tfcontrol.Invalidate(true);
		}

		//обработчик нажатия на кнопку "тест 3"
		private void test3Button_Click(object sender, EventArgs e)
		{
			if (doc == null)
				return;
			Document document = doc;

			document.BeginChanges("Создание 3D элементов");

			CoordinateNode3D node1 = new CoordinateNode3D(document);
			node1.X = 100;
			node1.Y = 100;
			node1.Z = 100;
			CoordinateNode3D node2 = new CoordinateNode3D(document);
			node2.X = 100;
			node2.Y = 200;
			node2.Z = 200;
			CoordinateNode3D node3 = new CoordinateNode3D(document);
			node3.X = 100;
			node3.Y = 300;
			node3.Z = 100;

			CoordinateNode3D node4 = new CoordinateNode3D(document);
			node4.X = -100;
			node4.Y = 100;
			node4.Z = 200;
			CoordinateNode3D node5 = new CoordinateNode3D(document);
			node5.X = -100;
			node5.Y = 200;
			node5.Z = 100;
			CoordinateNode3D node6 = new CoordinateNode3D(document);
			node6.X = -100;
			node6.Y = 300;
			node6.Z = 200;

			document.ApplyChanges();
			InterpolatingSplinePath3D path1 = new InterpolatingSplinePath3D(document);
			path1.Points.Add(node1.Geometry.Point);
			path1.Points.Add(node2.Geometry.Point);
			path1.Points.Add(node3.Geometry.Point);

			InterpolatingSplinePath3D path2 = new InterpolatingSplinePath3D(document);
			path2.Points.Add(node4.Geometry.Point);
			path2.Points.Add(node5.Geometry.Point);
			path2.Points.Add(node6.Geometry.Point);

			document.ApplyChanges();

			Loft loft = new Loft(document);
			loft.InsertProfile(0, path1.Geometry.Wire);
			loft.InsertProfile(1, path2.Geometry.Wire);

			document.EndChanges();

			tfcontrol.RefreshTabs();
			tfcontrol.Invalidate(true);
			 
		}
		

	}
}
